package Hauptpaket;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

import java.util.ArrayList;
import java.util.List;

import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;

public class Parser
{
	public static List<Config> loadConfig()
        throws FileNotFoundException, XMLStreamException
    {
    	List<Config> configs = new ArrayList<Config>();
    	
        XMLInputFactory factory = XMLInputFactory.newInstance();
        factory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.TRUE);
        
        InputStream in = new FileInputStream("config.xml");
        XMLStreamReader parser = factory.createXMLStreamReader(in);

        Config config = null;
        
        List<Unterseitenkriterium> unterseitensuchkriterien = new ArrayList<Unterseitenkriterium>();
        
        while (parser.hasNext())
        {        	
        	int event = (Integer) parser.next();
        	
            if(event == XMLStreamConstants.START_ELEMENT)
            {
            	String startElement = parser.getLocalName();
            	
            	if(startElement.equals("config"))
            		config = new Config();
            	else if(startElement.equals("bezeichnung"))
            	{
            		event = parser.next();
            		config.setBezeichnung(parser.getText().replaceAll("\\n", "").replaceAll("\\t", ""));
            	}
            	else if(startElement.equals("startseite"))
            	{
            		event = parser.next();
            		config.setStartseite(parser.getText().replaceAll("\\n", "").replaceAll("\\t", ""));
            	}
            	else if(startElement.equals("unterseitensuchkrit"))
            	{            		
            		event = parser.nextTag();
            		event = parser.next();            		
            		String url = parser.getText().replaceAll("\\n", "").replaceAll("\\t", "");
            		
            		event = parser.nextTag();
            		event = parser.nextTag();
            		event = parser.next();
            		String regex = parser.getText().replaceAll("\\n", "").replaceAll("\\t", "");
            		
            		//System.out.println("url: " + url + " regex: " + regex);
            		
            		unterseitensuchkriterien.add(new Unterseitenkriterium(url, regex));
            	}
            }
            else if(event == XMLStreamConstants.END_ELEMENT)
            {
            	if(parser.getLocalName().equals("config"))
            	{
            		config.setUnterseitenkriterium(unterseitensuchkriterien);
            		configs.add(config);
            		
            		unterseitensuchkriterien = new ArrayList<Unterseitenkriterium>();
            	}
            }
        }

        return configs;
    }
	
	public static List<UnsortierterInhalt> ladeUnsortierterInhalt(String pfad)
	        throws FileNotFoundException, XMLStreamException
    {
    	List<UnsortierterInhalt> unsortierteInhalte = new ArrayList<UnsortierterInhalt>();
    	
    	XMLInputFactory factory = XMLInputFactory.newInstance();
        factory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.TRUE);
        
        InputStream in = new FileInputStream(pfad);
        XMLStreamReader parser = factory.createXMLStreamReader(in);

        UnsortierterInhalt unsortierterInhalt = null;
    	
        while (parser.hasNext())
        {        	
        	int event = (Integer) parser.next();
        	
            if(event == XMLStreamConstants.START_ELEMENT)
            {
            	String startElement = parser.getLocalName();
            	
            	if(startElement.equals("link"))
            	{
            		unsortierterInhalt = new UnsortierterInhalt();
            		
            		parser.next();	            		
            		unsortierterInhalt.setLink(parser.getText());
            	}
            	else if(startElement.equals("inhalt"))
            	{	            		
            		parser.next();	            		
            		unsortierterInhalt.setInhalt(parser.getText());
            	}
            	
            }
        	else if(event == XMLStreamConstants.END_ELEMENT)
        	{
            	if(parser.getLocalName().equals("inhalt"))
            		unsortierteInhalte.add(unsortierterInhalt);
        	}
        }

        return unsortierteInhalte;
    }
	
	public static List<Replace> ladeReplacements() throws FileNotFoundException, XMLStreamException
    {
    	List<Replace> replacements = new ArrayList<Replace>();
    	
    	XMLInputFactory factory = XMLInputFactory.newInstance();
        factory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.TRUE);
        
        InputStream in = new FileInputStream("replace.xml");
        XMLStreamReader parser = factory.createXMLStreamReader(in);

        Replace replacement = null;
    	
        while (parser.hasNext())
        {        	
        	int event = (Integer) parser.next();
        	
            if(event == XMLStreamConstants.START_ELEMENT)
            {
            	String startElement = parser.getLocalName();
            	
            	if(startElement.equals("replace"))
            	{
            		replacement = new Replace();
            	}
            	else if(startElement.equals("regex"))
            	{
            		parser.next();            		
            		replacement.setRegex(parser.getText());
            	}
            	else if(startElement.equals("replacement"))
            	{	            		
            		parser.next();	            		
            		replacement.setReplacement(parser.getText());
            	}
            	
            }
        	else if(event == XMLStreamConstants.END_ELEMENT)
        	{
            	if(parser.getLocalName().equals("replace"))
            		replacements.add(replacement);
        	}
        }
    	
    	return replacements;
    }
	
	public static List<RegAusdruck> ladeRegAusdruck() 
			throws FileNotFoundException, XMLStreamException
	{
		List<RegAusdruck> regAusdruecke = new ArrayList<RegAusdruck>();
		RegAusdruck regAusdruck = null;
		
		XMLInputFactory factory = XMLInputFactory.newInstance();
        factory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.TRUE);
        
        InputStream in = new FileInputStream("getresults.xml");
        XMLStreamReader parser = factory.createXMLStreamReader(in);
        
        while (parser.hasNext())
        {
        	int event = (Integer) parser.next();
        	
	        if(event == XMLStreamConstants.START_ELEMENT)
	        {
	        	String startElement = parser.getLocalName();
	        	
	        	if(startElement.equals("result"))
	        		regAusdruck = new RegAusdruck();
	        	else if(startElement.equals("url"))
	        	{
	        		parser.next();            		
	        		regAusdruck.setUrl(parser.getText());
	        	}
	        	else if(startElement.equals("model"))
	        	{
	        		parser.next();            		
	        		regAusdruck.setModel(parser.getText());
	        	}
	        	else if(startElement.equals("cpuhersteller"))
	        	{
	        		parser.next();            		
	        		regAusdruck.setCpuhersteller(parser.getText());
	        	}
	        	else if(startElement.equals("prozessor"))
	        	{
	        		parser.next();            		
	        		regAusdruck.setProzessor(parser.getText());
	        	}	        	
	        	else if(startElement.equals("os"))
	        	{	            		
	        		parser.next();	            		
	        		regAusdruck.setOs(parser.getText());
	        	}
	        	else if(startElement.equals("ram"))
	        	{
	        		parser.next();            		
	        		regAusdruck.setRam(parser.getText());
	        	}
	        	else if(startElement.equals("grafik"))
	        	{
	        		parser.next();            		
	        		regAusdruck.setGrafik(parser.getText());
	        	}
	        	else if(startElement.equals("hdd"))
	        	{
	        		parser.next();            		
	        		regAusdruck.setHdd(parser.getText());
	        	}
	        	else if(startElement.equals("groesse"))
	        	{
	        		parser.next();            		
	        		regAusdruck.setGroesse(parser.getText());
	        	}
	        	else if(startElement.equals("bildschirm"))
	        	{
	        		parser.next();            		
	        		regAusdruck.setBildschirm(parser.getText());
	        	}
	        }
	        else if(event == XMLStreamConstants.END_ELEMENT)
	        {
	        	if(parser.getLocalName().equals("result"))
	        		regAusdruecke.add(regAusdruck);
	        }
        }
		
		return regAusdruecke;
	}
}
